在前面二篇的文章裡,範例均是以文字陣列資料做為向量處理的來源資料,而實務上可能面臨更多的來源資料格式,包含:Web pages、PDF、Word、Markdown....等,這時候使用 Semantic Kernel 就顯得有點力不從心了,因為 Semantic Kernel 只能支援使用文字來源,所以當面對非單純文字來源的格式,必須依賴開發者自行處理資料的讀取轉成文字再由 Semantic Kernel 的 memory 模組做向量處理。
事實上從 Semantic Kernel 早期發展時就有延伸另一個套件 Kernel Memory,它是基於 Semantic Kernel 和 Semantic Memory 中收到的回饋和經驗獨立發展的服務,支援多種資料來源格式,提供更多的儲存服務,因此本篇最後一天的鐵人賽文章,就用 Kernel Memory 與 Qdrant 向量資料庫實作 RAG 來做個結尾。
本次範例從全國法規庫取得 2 份PDF法規文件,分別是"所得稅法"以及"勞基法",示範使用 Kernel Memory 轉入 Qdrant 向量資料庫儲存,並且以問答方式從文件中取得回覆,而這個回覆是經過生成後的回覆,實現自然語言的回應,並非原始內容直接輸出。
dotnet add package Microsoft.KernelMemory.Core
var aoaiEmbeddingConfig = new AzureOpenAIConfig()
{
Auth = AzureOpenAIConfig.AuthTypes.APIKey,
APIKey = Config.aoai_apiKey,
Endpoint = Config.aoai_endpoint,
APIType = AzureOpenAIConfig.APITypes.ChatCompletion,
Deployment = Config.aoai_embedding_deployment
};
var aoaiTextGenConfig = new AzureOpenAIConfig()
{
Auth = AzureOpenAIConfig.AuthTypes.APIKey,
APIKey = Config.aoai_apiKey,
Endpoint = Config.aoai_endpoint,
APIType = AzureOpenAIConfig.APITypes.ChatCompletion,
Deployment = Config.aoai_deployment
};
var memory = new KernelMemoryBuilder()
.WithAzureOpenAITextEmbeddingGeneration(aoaiEmbeddingConfig)
.WithAzureOpenAITextGeneration(aoaiTextGenConfig)
.WithQdrantMemoryDb("http://localhost:6333")
.Build<MemoryServerless>();
await memory.ImportDocumentAsync("所得稅法.pdf", index: "Demo_KM", documentId: "1", tags: new() { { "Law", "Tax" } });
await memory.ImportDocumentAsync("勞動基準法.pdf", index: "Demo_KM", documentId: "2", tags: new() { { "Law", "Labor" } });
var ansewer = new MemoryAnswer();
ansewer = await memory.AskAsync("加班可以不給加班費嗎", index: "Demo_KM");
Console.WriteLine(ansewer);
//輸出結果
// 根據勞動基準法的規定,雇主在延長勞工工作時間時,必須依照法定標準支付加班費。具體來說,延長工作時間的工資應按照以下標準加給:
// 1. 延長工作時間在兩小時以內者,按平日每小時工資額加給三分之一以上。
// 2. 再延長工作時間在兩小時以內者,按平日每小時工資額加給三分之二以上。
// 3. 若依相關規定延長工作時間,則按平日每小時工資額加倍發給。
// 因此,雇主不得隨意不支付加班費,否則將違反勞動基準法的相關規定。若雇主未按期給付工資,主管機關可限期令其給付,勞工也有權要求支付應得的加班費。
// - Sources:
// - 勞動基準法.pdf [2024年10月13日]
ansewer = await memory.AskAsync("加班可以不給加班費嗎", index: "Demo_KM", filter: new MemoryFilter().ByTag("Law", "Labor"));
Console.WriteLine(ansewer);
//輸出結果
// 根據勞動基準法的規定,雇主在延長勞工工作時間時,必須依照法定標準支付加班費。具體來說,雇主延長勞工工作時間的工資應按照以下標準加給:
// 1. 延長工作時間在兩小時以內者,按平日每小時工資額加給三分之一以上。
// 2. 再延長工作時間在兩小時以內者,按平日每小時工資額加給三分之二以上。
// 3. 若依相關規定延長工作時間,則按平日每小時工資額加倍發給。
// 因此,雇主不得隨意不支付加班費,否則將違反勞動基準法的相關規定。若雇主未按期給付工資,主管機關可限期令其給付,並且勞工有權要求支付應得的加班費。
// - Sources:
// - 勞動基準法.pdf [2024年10月13日]
Console.WriteLine("\n\n");
ansewer = await memory.AskAsync("加班可以不給加班費嗎", index: "Demo_KM", filter: new MemoryFilter().ByTag("Law", "Tax"));
Console.WriteLine(ansewer);
//輸出結果
// 根據一般的勞動法規,加班通常應支付加班費。然而,具體情況可能因國家或地區的法律而異。在某些情況下,例如員工的薪資結構中已包含加班費,或是根據勞動合同的約定,可能會出現不支付加班費的情況。
// 在台灣,根據《勞動基準法》,雇主應支付加班費,除非有特別的約定或情況。因此,若雇主未依法律規定支付加班費,則可能違反相關法律。
// 總之,通常情況下,加班應支付加班費,除非有明確的法律或合同規定可以不支付。
// - Sources:
// - 所得稅法.pdf [2024年10月13日]
Console.WriteLine("\n\n");
ansewer = await memory.AskAsync("加班可以不給加班費嗎", index: "Demo_KM", filter: new MemoryFilter().ByTag("Law", "Tax"),minRelevance:0.8);
Console.WriteLine(ansewer);
//輸出結果
// INFO NOT FOUND
終於來到30天完賽囉,這30天重新介紹了我一直在使用的 Semantic Kernel,時間倉促內容安排不是那麼的流暢,而其實還有很多想寫的內容,接下來如果大家還有興趣觀注 Semantic Kernel 的話,可以訂閱我的blog以及我在facebook上成立的SK社團。
想了解更仔細的RAG以及Qdrant 向量資料庫,容我工商一下囉
我合著的新書:點這